--- /dev/null
+/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
+
+const Lang = imports.lang;
+const DBus = imports.dbus;
+const Mainloop = imports.mainloop;
+const Gio = imports.gi.Gio;
+const Params = imports.misc.params;
+
+const Main = imports.ui.main;
+const ScreenSaver = imports.misc.screenSaver;
+
+// GSettings keys
+const SETTINGS_SCHEMA = 'org.gnome.desktop.media-handling';
+const SETTING_ENABLE_AUTOMOUNT = 'automount';
+
+const ConsoleKitSessionIface = {
+ name: 'org.freedesktop.ConsoleKit.Session',
+ methods: [{ name: 'IsActive',
+ inSignature: '',
+ outSignature: 'b' }],
+ signals: [{ name: 'ActiveChanged',
+ inSignature: 'b' }]
+};
+
+const ConsoleKitSessionProxy = DBus.makeProxyClass(ConsoleKitSessionIface);
+
+const ConsoleKitManagerIface = {
+ name: 'org.freedesktop.ConsoleKit.Manager',
+ methods: [{ name: 'GetCurrentSession',
+ inSignature: '',
+ outSignature: 'o' }]
+};
+
+function ConsoleKitManager() {
+ this._init();
+};
+
+ConsoleKitManager.prototype = {
+ _init: function() {
+ this.sessionActive = true;
+
+ DBus.system.proxifyObject(this,
+ 'org.freedesktop.ConsoleKit',
+ '/org/freedesktop/ConsoleKit/Manager');
+
+ DBus.system.watch_name('org.freedesktop.ConsoleKit',
+ false, // do not launch a name-owner if none exists
+ Lang.bind(this, this._onManagerAppeared),
+ Lang.bind(this, this._onManagerVanished));
+ },
+
+ _onManagerAppeared: function(owner) {
+ this.GetCurrentSessionRemote(Lang.bind(this, this._onCurrentSession));
+ },
+
+ _onManagerVanished: function(oldOwner) {
+ this.sessionActive = true;
+ },
+
+ _onCurrentSession: function(session) {
+ this._ckSession = new ConsoleKitSessionProxy(DBus.system, 'org.freedesktop.ConsoleKit', session);
+
+ this._ckSession.connect
+ ('ActiveChanged', Lang.bind(this, function(object, isActive) {
+ this.sessionActive = isActive;
+ }));
+ this._ckSession.IsActiveRemote(Lang.bind(this, function(isActive) {
+ this.sessionActive = isActive;
+ }));
+ }
+};
+DBus.proxifyPrototype(ConsoleKitManager.prototype, ConsoleKitManagerIface);
+
+function AutomountManager() {
+ this._init();
+}
+
+AutomountManager.prototype = {
+ _init: function() {
+ this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
+ this._volumeQueue = [];
+
+ this.ckListener = new ConsoleKitManager();
+
+ this._ssProxy = new ScreenSaver.ScreenSaverProxy();
+ this._ssProxy.connect('active-changed',
+ Lang.bind(this,
+ this._screenSaverActiveChanged));
+
+ this._volumeMonitor = Gio.VolumeMonitor.get();
+
+ this._volumeMonitor.connect('volume-added',
+ Lang.bind(this,
+ this._onVolumeAdded));
+ this._volumeMonitor.connect('volume-removed',
+ Lang.bind(this,
+ this._onVolumeRemoved));
+
+ Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
+ },
+
+ _screenSaverActiveChanged: function(object, isActive) {
+ if (!isActive) {
+ this._volumeQueue.forEach(Lang.bind(this, function(volume) {
+ this._checkAndMountVolume(volume);
+ }));
+ }
+
+ // clear the queue anyway
+ this._volumeQueue = [];
+ },
+
+ _startupMountAll: function() {
+ let volumes = this._volumeMonitor.get_volumes();
+ volumes.forEach(Lang.bind(this, function(volume) {
+ this._checkAndMountVolume(volume, { checkSession: false,
+ useMountOp: false });
+ }));
+
+ return false;
+ },
+
+ _onVolumeAdded: function(monitor, volume) {
+ this._checkAndMountVolume(volume);
+ },
+
+ _checkAndMountVolume: function(volume, params) {
+ params = Params.parse(params, { checkSession: true,
+ useMountOp: true });
+
+ if (!this._settings.get_boolean(SETTING_ENABLE_AUTOMOUNT))
+ return;
+
+ if (!volume.should_automount() ||
+ !volume.can_mount())
+ return;
+
+ if (params.checkSession) {
+ // if we're not in the current ConsoleKit session,
+ // don't attempt automount
+ if (!this.ckListener.sessionActive)
+ return;
+
+ if (this._ssProxy.getActive()) {
+ if (this._volumeQueue.indexOf(volume) == -1)
+ this._volumeQueue.push(volume);
+
+ return;
+ }
+ }
+
+ // TODO: mount op
+ this._mountVolume(volume, null);
+ },
+
+ _mountVolume: function(volume, operation) {
+ volume.mount(0, operation, null,
+ Lang.bind(this, this._onVolumeMounted));
+ },
+
+ _onVolumeMounted: function(volume, res) {
+ try {
+ volume.mount_finish(res);
+ } catch (e) {
+ log('Unable to mount volume ' + volume.get_name() + ': ' +
+ e.toString());
+ }
+ },
+
+ _onVolumeRemoved: function(monitor, volume) {
+ this._volumeQueue =
+ this._volumeQueue.filter(function(element) {
+ return (element != volume);
+ });
+ }
+}